package com.candy.biz.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.candy.biz.domain.entity.SysLog;
import com.candy.biz.domain.param.SysLogQueryParam;
import com.candy.biz.domain.param.SysLogSaveParam;
import com.candy.biz.domain.vo.SysLogVO;
import com.candy.biz.manager.SysLogManager;
import com.candy.biz.mapper.SysLogMapper;
import com.candy.biz.service.SysLogService;
import com.candy.common.domain.PageVO;
import com.candy.common.utils.CommonUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.If;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.candy.biz.domain.entity.table.SysLogTableDef.SYS_LOG;

/**
 * 操作日志-服务层实现。
 *
 * @author rong xi
 * @date 2023/10/11 17:54
 * @version 1.0.0
 */
@Service
public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements SysLogService {

    /**
     * 查询操作日志详情
     *
     * @param id 操作日志id
     * @return 详情VO
     */
    @Override
    public SysLogVO queryInfo(Long id) {
        return this.getByIdOpt(id).map(SysLogManager::poToVo).orElse(null);
    }

    /**
     * 分页查询操作日志
     *
     * @param param 查询参数
     * @return 分页结果
     */
    @Override
    public PageVO<SysLogVO> queryPage(SysLogQueryParam param) {
        Page<SysLog> page = queryChain()
                .select(SYS_LOG.ALL_COLUMNS)
                .from(SYS_LOG)
                .where(SYS_LOG.ID.eq(param.getId(), If::notNull))
                .and(SYS_LOG.ID.eq(param.getId(), If::notNull))
                .and(SYS_LOG.MODULE_NAME.like(param.getModuleName(), If::hasText))
                .and(SYS_LOG.TYPE.eq(param.getType(), If::hasText))
                .and(SYS_LOG.DESCRIBE.eq(param.getDescribe(), If::hasText))
                .and(SYS_LOG.USER_ID.eq(param.getUserId(), If::notNull))
                .and(SYS_LOG.USER_NAME.like(param.getUserName(), If::hasText))
                .and(SYS_LOG.REQUEST_IP.like(param.getRequestIp(), If::hasText))
                .and(SYS_LOG.REQUEST_TIME.eq(param.getRequestTime(), If::notNull))
                .and(SYS_LOG.COST_TIME.eq(param.getCostTime(), If::notNull))
                .and(SYS_LOG.ERROR_MSG.eq(param.getErrorMsg(), If::hasText))
                .and(SYS_LOG.RESPONSE_CONTENT.eq(param.getResponseContent(), If::hasText))
                .orderBy(param.getOrderBy(SYS_LOG))
                .page(param.getPage());
        return SysLogManager.pageToPageVO(page);
    }


    /**
     * 根据查询条件导出操作日志。
     *
     * @param param 查询条件
     */
    @Override
    @SneakyThrows
    public void export(SysLogQueryParam param) {
        //修改分页条件
        param.preparationExport();
        //查询数据
        List<SysLogVO> rows = queryPage(param).getList();
        //导出文件
        CommonUtil.exportExcel("操作日志",rows,SysLogVO.class);
    }


    /**
     * 保存操作日志
     *
     * @param param 保存参数
     * @return 保存结果
     */
    @Override
    public Boolean saveHandle(SysLogSaveParam param) {
        return CommonUtil.<SysLogSaveParam,Boolean>predicateFunction(param,
                (p)-> ObjectUtil.isNull(p.getId()),
                (p)->this.save(SysLogManager.insertPrepare(p)),
                (p)-> this.updateById(SysLogManager.updatePrepare(p)));
    }
}
